# 导入常用库
import pandas as pd
import numpy as np
# 绘图库
import plotly.express as px
import plotly.graph_objects as go
import matplotlib.pyplot as plt
import warnings
warnings.filterwarnings('ignore')

# 定义一个前期理解数据的通用函数
def data_comprehension(path):
    # 读取文件
    df = pd.read_csv(path)
    # dataframe的维度
    print('数据集维度为:'f'{df.shape}')
    # 查看数据统计信息
    print('数据统计信息-------------------------------')
    print(df.describe())
    # 查看数据类型
    print('数据类型-----------------------------------')
    print(df.info())
    # 查看数据是否有重复值
    print('数据重复值---------------------------------')
    print('数据集的重复值为:'f'{df.duplicated().sum()}')
    # 查看数据是否有缺失值
    print('数据缺失值---------------------------------')
    print(df.isnull().sum())
    # 查看数据集的前五行
    print(df.head())

# 训练集路径
train_path = r'./data/train.csv'
#data_comprehension(train_path)

# 测试集路径
test_path = r'./data/test.csv'
#data_comprehension(test_path)

# 训练集标签统计
train = pd.read_csv(train_path)
test = pd.read_csv(test_path)
# 从训练集提取出label
labeldf = train[['是否流失']]
print(labeldf['是否流失'].value_counts())

# 百分比显示
print(labeldf['是否流失'].value_counts(normalize = True))
# 训练集标签相对是比较均衡的，基本是1：1的比例。

# 训练集和测试集合并
# 存储label
labeldf.to_csv(r'./data/label.csv',index = False,encoding = 'utf-8')
# 删除训练集的label列
train = train.drop(['是否流失'],axis = 1)
# 合并
total = pd.concat([train,test],axis = 0)
# 存储合并文件
total.to_csv(r'./data/total.csv',index = False,encoding = 'utf-8')
print(total.shape) # 合并文件维度

# 因为该数据集都是数值型特征，基本不用特地的划分数值数据集和离散数据集
# 2.EDA分析（探索性数据分析）
# 2.1 标签与特征之间的交叉统计

# 读取原训练集数据
train_statistic = pd.read_csv(train_path)
# 遍历训练集列表
for i in list(train_statistic.columns):
    if (i != '客户ID') & (i != '是否流失'):
        # 绘制直方图
        label_hist = px.histogram(train_statistic,x = i,color = '是否流失',marginal = 'box',barmode = 'overlay')
        label_hist.write_html(f'./data/交叉统计-overlay/{i}.html')
        #label_hist.show()
print('绘图成功~')
'''
从交叉统计分析，我们可以获得如下信息：（因为不知道标签0和1分别代表的内容，就暂时用标签区分）
* 相较于标签1，标签0可以区分的信息：
设备使用天数在0-300次之间，地理区域为7和16，婚姻状况为0和1，在职总月数为6-10月，账户消费限额为1的偏向于标签0。

* 相较于标签0，标签1可以区分的信息：
设备使用天数在300-400次之间，婚姻状况为3，在职总月数为11-13月偏向于标签1。
'''
